#!/usr/bin/env python3
"""
linuxconsoletools MCP Server

面向 linuxconsoletools 软件套件的 MCP server，提供对 linuxconsoletools 中各种命令行工具的封装。

MCP tools 列表：
1. linuxconsoletools_help - 测试 linuxconsoletools 套件中各个命令的帮助功能
   参数：无
   返回：包含所有命令帮助测试结果的 JSON

2. evdev_joystick_help - 测试 evdev-joystick 命令的帮助功能
   参数：无
   返回：包含 evdev-joystick 帮助测试结果的 JSON

3. evdev_joystick_listdevs - 使用 evdev-joystick 的 --listdevs 选项列出输入设备
   参数：无
   返回：包含设备列表测试结果的 JSON

4. evdev_joystick_showcal - 使用 evdev-joystick 的 --showcal 选项显示设备校准信息
   参数：device_path - 输入设备路径，如 /dev/input/event1
   返回：包含校准信息测试结果的 JSON

5. evdev_joystick_evdev - 使用 evdev-joystick 的 --evdev 选项显示事件设备信息
   参数：device_path - 输入设备路径，如 /dev/input/event1
   返回：包含事件设备信息测试结果的 JSON

6. evdev_joystick_calibrate - 使用 evdev-joystick 的各种校准选项进行设备校准
   参数：
     device_path - 输入设备路径，如 /dev/input/event1
     minimum - 最小校准值（可选）
     maximum - 最大校准值（可选）
     deadzone - 死区校准值（可选）
     fuzz - 模糊校准值（可选）
     axis - 轴索引（可选）
   返回：包含校准操作测试结果的 JSON

所有工具返回统一的 JSON 结构：
{
  "success": bool,
  "command": str,
  "exit_code": int,
  "stdout": str,
  "stderr": str
}
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import Optional

mcp = FastMCP("Linuxconsoletools MCP Server")

@mcp.tool()
def linuxconsoletools_help() -> dict:
    """
    测试 linuxconsoletools 套件中各个命令的帮助功能
    
    用途：测试 ffcfstress、ffset、fftest、inputattach、jscal、jstest 等命令的 -h/--help 选项
    参数：无
    返回：包含所有命令帮助测试结果的 JSON 结构
    """
    commands = [
        ("ffcfstress -h", "ffcfstress -h"),
        ("ffcfstress --help", "ffcfstress --help"),
        ("ffset --help", "ffset --help"),
        ("fftest --help", "fftest --help"),
        ("inputattach --help", "inputattach --help"),
        ("jscal -h", "jscal -h"),
        ("jscal --help", "jscal --help"),
        ("jstest --help", "jstest --help")
    ]
    
    results = []
    for cmd, desc in commands:
        try:
            result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
            results.append({
                "command": desc,
                "success": result.returncode == 0,
                "exit_code": result.returncode,
                "stdout": result.stdout,
                "stderr": result.stderr
            })
        except Exception as e:
            results.append({
                "command": desc,
                "success": False,
                "exit_code": -1,
                "stdout": "",
                "stderr": str(e)
            })
    
    return {
        "success": all(r["success"] for r in results),
        "commands": results
    }

@mcp.tool()
def evdev_joystick_help() -> dict:
    """
    测试 evdev-joystick 命令的帮助功能
    
    用途：测试 evdev-joystick 的 --help 选项
    参数：无
    返回：包含帮助测试结果的 JSON 结构
    """
    cmd = "evdev-joystick --help"
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": cmd,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": cmd,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def evdev_joystick_listdevs() -> dict:
    """
    使用 evdev-joystick 的 --listdevs 选项列出输入设备
    
    用途：测试 evdev-joystick 的 --listdevs 功能，列出系统可用的输入设备
    参数：无
    返回：包含设备列表测试结果的 JSON 结构
    """
    cmd = "evdev-joystick --listdevs"
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": cmd,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": cmd,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def evdev_joystick_showcal(device_path: str) -> dict:
    """
    使用 evdev-joystick 的 --showcal 选项显示设备校准信息
    
    用途：显示指定输入设备的校准信息
    参数：
      device_path - 输入设备路径，如 /dev/input/event1
    返回：包含校准信息测试结果的 JSON 结构
    """
    cmd = f"evdev-joystick --showcal {device_path}"
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": cmd,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": cmd,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def evdev_joystick_evdev(device_path: str) -> dict:
    """
    使用 evdev-joystick 的 --evdev 选项显示事件设备信息
    
    用途：显示指定事件设备的信息
    参数：
      device_path - 输入设备路径，如 /dev/input/event1
    返回：包含事件设备信息测试结果的 JSON 结构
    """
    cmd = f"evdev-joystick --evdev {device_path}"
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": cmd,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": cmd,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def evdev_joystick_calibrate(
    device_path: str,
    minimum: Optional[int] = None,
    maximum: Optional[int] = None,
    deadzone: Optional[int] = None,
    fuzz: Optional[int] = None,
    axis: Optional[int] = None
) -> dict:
    """
    使用 evdev-joystick 的各种校准选项进行设备校准
    
    用途：对指定输入设备进行各种校准操作
    参数：
      device_path - 输入设备路径，如 /dev/input/event1
      minimum - 最小校准值（可选）
      maximum - 最大校准值（可选）
      deadzone - 死区校准值（可选）
      fuzz - 模糊校准值（可选）
      axis - 轴索引（可选）
    返回：包含校准操作测试结果的 JSON 结构
    """
    base_cmd = f"evdev-joystick --e {device_path}"
    
    if minimum is not None:
        base_cmd += f" --minimum {minimum}"
    if maximum is not None:
        base_cmd += f" --maximum {maximum}"
    if deadzone is not None:
        base_cmd += f" --deadzone {deadzone}"
    if fuzz is not None:
        base_cmd += f" --fuzz {fuzz}"
    if axis is not None:
        base_cmd += f" --axis {axis}"
    
    try:
        result = subprocess.run(base_cmd, shell=True, capture_output=True, text=True, timeout=30)
        return {
            "success": result.returncode == 0,
            "command": base_cmd,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": base_cmd,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()